package com.chenxinzhimusic.viewmodel.page


import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.chenxinzhimusic.viewmodel.Abslist
import com.chenxinzhimusic.api.Api


class AbsPagingSource(private val api: Api, private val query: String) :
    PagingSource<Int, Abslist>() {
    override fun getRefreshKey(state: PagingState<Int, Abslist>): Int? {
        // 当数据刷新时（例如，用户下拉刷新），返回一个锚点页码，
        // Paging 库会尝试从这个页码开始重新加载数据。
        // 常见的做法是返回当前可见项的页码。
        return state.anchorPosition?.let { anchorPosition ->
            val anchorPage = state.closestPageToPosition(anchorPosition)
            anchorPage?.prevKey?.plus(1) ?: anchorPage?.nextKey?.minus(1)
        }
    }

    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Abslist> {
        try {
            // 获取当前页码，如果是第一次加载，则默认为第一页
            val currentPage = params.key ?: 0
            // 获取每页加载的数据量
            val pageSize = params.loadSize
            if (query.isBlank()) {
                return LoadResult.Page(
                    data = listOf(),
                    prevKey = if (currentPage == 0) null else currentPage - 1, // 第一页没有上一页
                    nextKey = null
                )
            }
            // 从网络服务获取数据
            val abs = api.page(query, currentPage, pageSize)
            if (abs == null) {
                throw Exception("网络错误")
            }

            // 计算下一页的页码
            val nextKey = if (abs.sHOW != pageSize.toString()) null else currentPage + 1

            // 返回 LoadResult.Page
            return LoadResult.Page(
                data = abs.abslist,
                prevKey = if (currentPage == 0) null else currentPage - 1, // 第一页没有上一页
                nextKey = nextKey
            )
        } catch (exception: Exception) {
            return LoadResult.Error(exception)
        }
    }
}